package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;

/**
 * 旧物订单实体类
 *
 * 用于存储旧物交易订单信息，包括：
 * - 订单基本信息（订单号、总金额、备注等）
 * - 买卖双方信息关联
 * - 订单状态管理
 * - 收货地址关联
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("旧物订单")
@TableName(autoResultMap = true)
public class GoodsOrder {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 订单号
	 * 订单的唯一标识号
	 */
	@ApiModelProperty("订单号")
	private String orderNo;

	/**
	 * 买家ID
	 * 购买用户，自动填充当前用户ID
	 * 关联User表
	 */
	@ApiModelProperty("买家ID")
	@TableField(fill = FieldFill.INSERT)
	@Constraint(referenceClass = User.class)
	private Integer userId;

	/**
	 * 卖家ID
	 * 商品卖家ID
	 */
	@ApiModelProperty("卖家ID")
	private Integer sellerId;

	/**
	 * 地址ID
	 * 收货地址ID
	 */
	@ApiModelProperty("地址ID")
	private Integer addressId;

	/**
	 * 订单总金额
	 */
	@ApiModelProperty("总金额")
	private Double totalPrice;

	/**
	 * 订单状态
	 * 1-待付款 2-待发货 3-待收货 4-已完成 5-已取消
	 * 使用枚举类型管理状态
	 */
	@ApiModelProperty("订单状态 1-待付款 2-待发货 3-待收货 4-已完成 5-已取消")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Status status;

	/**
	 * 订单备注
	 * 买家下单时的备注信息
	 */
	@ApiModelProperty("备注")
	private String remark;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 更新时间
	 * 自动填充插入和更新时间
	 */
	@ApiModelProperty("更新时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date updateTime;

	/**
	 * 买家昵称
	 * 非数据库字段，扩展查询字段，关联用户表获取昵称
	 */
	@TableField(exist = false)
	@ExtendQuery(referenceClass = User.class, targetColumn = "nickname")
	private String userName;

	/**
	 * 订单状态枚举
	 * 定义旧物订单的各种状态
	 */
	@Getter
	@AllArgsConstructor
	public enum Status implements BaseEnum<Status> {
		/**
		 * 待付款状态
		 */
		UN_PAY(1, "待付款"),
		/**
		 * 待发货状态
		 */
		UN_SHIP(2, "待发货"),
		/**
		 * 待收货状态
		 */
		UN_RECEIVE(3, "待收货"),
		/**
		 * 已完成状态
		 */
		FINISH(4, "已完成"),
		/**
		 * 已取消状态
		 */
		CANCEL(5, "已取消"),
		;
		private final Integer value;
		private final String label;
	}
}